package com.atguigu.day3;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;

public class CollectionNoSafe {
    /*证明集合不安全*/
    public static void main(String[] args) {
//        List<String> list = new ArrayList();
//        List<String> list = new Vector<>();
        /*HashSet HashMap 线程不安全*/
//        List<String> list = Collections.synchronizedList(new ArrayList<String>());
        Set<String> set1 = Collections.synchronizedSet(new HashSet<String>());
        CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
        //线程安全的HashSet集合
        CopyOnWriteArraySet<String> set2 = new CopyOnWriteArraySet<>();
        //线程安全的HashMap集合
        ConcurrentHashMap<String, String> ConcurrentHashMap = new ConcurrentHashMap<>();
        /*读写分离，写是复制*/
        for (int i = 1; i <= 100; i++) {
            new Thread(() -> {
                //写操作
                list.add(UUID.randomUUID().toString().substring(0, 6));
                //读操作
                System.out.println(list);
                //抛出了并发修改异常：java.util.ConcurrentModificationException
                //因为在进行读操作的时候有其他线程在进行写操作
            }, String.valueOf("t" + i)).start();
        }

        /*CopyOnWrite原理
        由于多线程并发进行读操作不会影响数据不需要加锁


          public boolean add(E e){
         * synchronized(lock){//首先确保在同一个时刻只有一个线程可以执行接下来的代码块，
         * 防止了多个线程进入而产生数据一致性问题。
         * Object[] es = getArray()//获取当前存储的对象数组
         * int len = es.length :获取当前数组的长度
         * es = Arrays.copyOf(es,len+1)创建一个新数组，长度原数组的长度+1，并将原数组中的所以元素复制到新数组
         * es[len]=e:添加一个元素，到数组最后一个位置
         * setArray(es) 用新数组替换旧数组
         *}
         *
         *
         * }
         *
         *
         *
         *
         *
         *
         *
         * */

    }
}
